package com.shujia.day09;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;

public class Demo09Set {
    public static void main(String[] args) {
        /*
            Set集合中不包含重复元素,并且是无序的
         */
        Set<String> stringSet = new HashSet<String>();
        stringSet.add("2");
        stringSet.add("3");
        stringSet.add("2");  // 去重了
        stringSet.add("4");
        System.out.println(stringSet);

        for (String value : stringSet) {
            System.out.println(value);
        }

        /*
            自定义类进行数据保存Set
                对于自定义类添加到Set中时,会按照对象的内存地址进行等值判断后去重
                    判断是通过 equals 方法 => 自定义类会继承Object默认使用 == 地址判断
         */

        Set<Data> data = new HashSet<>();
        Data data1 = new Data("1");
        data.add(data1);
        data.add(new Data("2"));
        data.add(data1);
        data.add(new Data("1"));
        data.add(new Data("3"));  // 重写 equals 后根据属性 value 进行比较
        System.out.println(data);
        System.out.println(data.size());


        for (Data datum : data) {
            System.out.println(datum.value);
        }


        /*
            Consumer 是一个接口 其中 consumer 指向的是匿名内部类
            consumer 变量名 只能获取到 Consumer接口中定义的内容,对于其子实现类(匿名内部类)中定义的内容无法进行获取
                但是对于 new 之后的内容 表述的是 匿名内部类 的对象 所以可以获取其内部定义的方法
         */

//        Integer consumer = new Consumer<Data>() {
//            int sum = 0;
//            @Override
//            public void accept(Data data) {
//                sum += Integer.valueOf(data.value);
//            }
//
//            public int getSum(){
//                return sum;
//            }
//        }.getSum();


        // 使用 局部内部类
        class InnerConsumer implements Consumer<Data>{
            int sum = 0;
            @Override
            public void accept(Data data) {
                sum += Integer.valueOf(data.value);
            }
        }
        InnerConsumer innerConsumer = new InnerConsumer();
        data.forEach(innerConsumer);
        System.out.println("sum:"+innerConsumer.sum);

    }
}
class Data{
    String value;

    public Data(String value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Data data = (Data) o;
        return Objects.equals(value, data.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
}
